package cn.teduymdj.jxc.service.impl;

import cn.teduymdj.jxc.ex.ServiceException;
import cn.teduymdj.jxc.mapper.GoodsMapper;
import cn.teduymdj.jxc.mapper.GoodsTypeMapper;
import cn.teduymdj.jxc.pojo.dto.GoodsTypeAddNewDTO;
import cn.teduymdj.jxc.pojo.entity.Goods;
import cn.teduymdj.jxc.pojo.entity.GoodsType;
import cn.teduymdj.jxc.pojo.vo.GoodsStandardVO;
import cn.teduymdj.jxc.pojo.vo.GoodsTypeStandsVO;
import cn.teduymdj.jxc.service.GoodsTypeService;
import cn.teduymdj.jxc.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 处理商品类型表相关业务的实现类
 * @author 陈坤鹏
 */
@Slf4j
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {

    public GoodsTypeServiceImpl() {
        log.debug("创建业务对象:GoodsTypeServiceImpl");
    }

    @Autowired
    private GoodsTypeMapper goodsTypeMapper;

    @Autowired
    private GoodsMapper goodsMapper;
    @Override
    public List<GoodsTypeStandsVO> getAllGoodsTypeByParentId(Long parentId) {
        return goodsTypeMapper.getAllGoodsTypeByParentId(parentId);
    }

    @Override
    public void saveGoodsType(GoodsTypeAddNewDTO goodsTypeAddNewDTO) {
        GoodsType goodsType = new GoodsType(goodsTypeAddNewDTO.getName(),0, goodsTypeAddNewDTO.getPId());
        GoodsTypeAddNewDTO addNewDTO = new GoodsTypeAddNewDTO();
        BeanUtils.copyProperties(goodsTypeAddNewDTO,addNewDTO);
        goodsTypeMapper.insert(addNewDTO);

        //根据父类ID来查询父类实体
        GoodsType parentGoodsType = goodsTypeMapper.getGoodsTypeById(goodsTypeAddNewDTO.getPId());

        //如果当前父商品类别是叶子节点，则需要修改为状态为根节点
        if(parentGoodsType.getState()==0){

            parentGoodsType.setState(1);

            GoodsTypeAddNewDTO dto = new GoodsTypeAddNewDTO();
            BeanUtils.copyProperties(parentGoodsType,dto);
            goodsTypeMapper.insert(dto);

        }

        int row = goodsTypeMapper.insert(goodsTypeAddNewDTO);
        if (row<1){
            throw new ServiceException(ServiceCode.ERR_INSERT,"插入失败,服务器忙");
        }
        log.debug("影响行数:{}",row);
    }

    @Override
    public GoodsTypeStandsVO getGoodsTypeById(Long id) {
        return goodsTypeMapper.getStandardById(id);
    }

    @Override
    public void delete(Long id) {
        //根据商品类别ID来查询商品信息，如果该类别下有商品信息，则不给予删除
        List<GoodsStandardVO> goodsList = goodsMapper.getGoodsByTypeId(id);
        if (goodsList!=null){
            throw new ServiceException(ServiceCode.ERR_DELETE,"删除失败,该类别存在商品");
        }

        //这里的逻辑是先根据商品类别ID查询出商品类别的信息，找到商品类别的父级商品类别
		//如果父商品类别的子商品类别信息等于1，那么再删除商品信息的时候，父级商品类别的状态也应该从根节点改为叶子节点
		GoodsType goodsType = goodsTypeMapper.getGoodsTypeById(id);

        List<GoodsTypeStandsVO> goodsTypeList = goodsTypeMapper.getAllGoodsTypeByParentId(goodsType.getpId());

        if(goodsTypeList.size()==1){

			GoodsType parentGoodsType = goodsTypeMapper.getGoodsTypeById(goodsType.getpId());

			parentGoodsType.setState(0);

            GoodsTypeAddNewDTO goodsTypeAddNewDTO = new GoodsTypeAddNewDTO();
            BeanUtils.copyProperties(parentGoodsType,goodsTypeAddNewDTO);
            goodsTypeMapper.insert(goodsTypeAddNewDTO);

		}

        int result = goodsTypeMapper.deleteById(id);
        if (result<1){
            throw new ServiceException(ServiceCode.ERR_DELETE,"删除商品失败,服务器忙,稍后再试");
        }
        log.debug("影响行数:{}",result);
    }




}
